package com.rrkd.util;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;  
import java.util.regex.Matcher;  
import java.util.regex.Pattern;  
  



import sun.misc.BASE64Decoder;  
import sun.misc.BASE64Encoder;
public class SM4Utils  
{  
    private static String secretKey = "JeF8U9wHFOMfs2Y8";  
    private static String iv = "UISwD9fW6cFh9SNS";  
    private static boolean hexString = false;  
      
    public SM4Utils()  
    {  
    }  
      
    public String encryptData_ECB(String plainText)  
    {  
        try   
        {  
            SM4_Context ctx = new SM4_Context();  
            ctx.isPadding = true;  
            ctx.mode = SM4.SM4_ENCRYPT;  
              
            byte[] keyBytes;  
            if (hexString)  
            {  
                keyBytes = Util.hexStringToBytes(secretKey);  
            }  
            else  
            {  
                keyBytes = secretKey.getBytes();  
            }  
              
            SM4 sm4 = new SM4();  
            sm4.sm4_setkey_enc(ctx, keyBytes);  
            byte[] encrypted = sm4.sm4_crypt_ecb(ctx, plainText.getBytes("utf-8"));  
            String cipherText = new BASE64Encoder().encode(encrypted);  
            if (cipherText != null && cipherText.trim().length() > 0)  
            {  
                Pattern p = Pattern.compile("\\s*|\t|\r|\n");  
                Matcher m = p.matcher(cipherText);  
                cipherText = m.replaceAll("");  
            }  
            return cipherText;  
        }   
        catch (Exception e)   
        {  
            e.printStackTrace();  
            return null;  
        }  
    }  
      
    public static  String decryptData_ECB(String cipherText)  
    {  
        try   
        {  
            SM4_Context ctx = new SM4_Context();  
            ctx.isPadding = true;  
            ctx.mode = SM4.SM4_DECRYPT;  
              
            byte[] keyBytes;  
            if (hexString)  
            {  
                keyBytes = Util.hexStringToBytes(secretKey);  
            }  
            else  
            {  
                keyBytes = secretKey.getBytes();  
            }  
              
            SM4 sm4 = new SM4();  
            sm4.sm4_setkey_dec(ctx, keyBytes);  
            byte[] decrypted = sm4.sm4_crypt_ecb(ctx, new BASE64Decoder().decodeBuffer(cipherText));  
            return new String(decrypted, "utf-8");  
        }   
        catch (Exception e)   
        {  
            e.printStackTrace();  
            return null;  
        }  
    }  
      
    public static String encryptData_CBC(String plainText)  
    {  
        try   
        {  
            SM4_Context ctx = new SM4_Context();  
            ctx.isPadding = true;  
            ctx.mode = SM4.SM4_ENCRYPT;  
              
            byte[] keyBytes;  
            byte[] ivBytes;  
            if (hexString)  
            {  
                keyBytes = Util.hexStringToBytes(secretKey);  
                ivBytes = Util.hexStringToBytes(iv);  
            }  
            else  
            {  
                keyBytes = secretKey.getBytes();  
                ivBytes = iv.getBytes();  
            }  
              
            SM4 sm4 = new SM4();  
            sm4.sm4_setkey_enc(ctx, keyBytes);  
            byte[] encrypted = sm4.sm4_crypt_cbc(ctx, ivBytes, plainText.getBytes("utf-8"));  
            String cipherText = new BASE64Encoder().encode(encrypted);  
            if (cipherText != null && cipherText.trim().length() > 0)  
            {  
                Pattern p = Pattern.compile("\\s*|\t|\r|\n");  
                Matcher m = p.matcher(cipherText);  
                cipherText = m.replaceAll("");  
            }  
            return cipherText;  
        }   
        catch (Exception e)   
        {  
            e.printStackTrace();  
            return null;  
        }  
    }  
      
    public static String decryptData_CBC(String cipherText)  
    {  
        try   
        {  
            SM4_Context ctx = new SM4_Context();  
            ctx.isPadding = true;  
            ctx.mode = SM4.SM4_DECRYPT;  
              
            byte[] keyBytes;  
            byte[] ivBytes;  
            if (hexString)  
            {  
                keyBytes = Util.hexStringToBytes(secretKey);  
                ivBytes = Util.hexStringToBytes(iv);  
            }  
            else  
            {  
                keyBytes = secretKey.getBytes();  
                ivBytes = iv.getBytes();  
            }  
              
            SM4 sm4 = new SM4();  
            sm4.sm4_setkey_dec(ctx, keyBytes);  
            byte[] decrypted = sm4.sm4_crypt_cbc(ctx, ivBytes, new BASE64Decoder().decodeBuffer(cipherText));  
            return new String(decrypted, "GBK");  
        }   
        catch (Exception e)  
        {  
            e.printStackTrace();  
            return null;  
        }  
    }  
      
    public static void main(String[] args) throws IOException   
    {  
        //String plainText = "ererfeiisgod";  
        File file=new File("E://nettyFile/test7.txt");
        String plainText=FileUtils.readString3(file);
        SM4Utils sm4 = new SM4Utils();  
        sm4.secretKey = "JeF8U9wHFOMfs2Y8";  
        sm4.hexString = false;
        
		
	 
//        System.out.println("ECB模式");  
       // String cipherText = sm4.encryptData_ECB(plainText);  
//        System.out.println("密文: " + cipherText);  
//        System.out.println("");  
//          
//        plainText = sm4.decryptData_ECB(cipherText);  
//        System.out.println("明文: " + plainText);  
//        System.out.println("");  
          
        System.out.println("CBC模式");  
        sm4.iv = "UISwD9fW6cFh9SNS";  
        String cipherText = sm4.encryptData_CBC(plainText);  
       
      //  System.out.println("密文: " + cipherText);  
        System.out.println("");  
          
       @SuppressWarnings("static-access")
       String plainTexts = sm4.decryptData_CBC(cipherText);  
       System.out.println(plainTexts);
    }  
}  
